package net.buycraft.plugin.sponge.tasks;
import lombok.AllArgsConstructor;
import net.buycraft.plugin.client.ApiException;
import net.buycraft.plugin.data.RecentPayment;
import net.buycraft.plugin.shared.config.signs.storage.RecentPurchaseSignPosition;
import net.buycraft.plugin.sponge.BuycraftPlugin;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.profile.GameProfile;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.stream.Collectors;
@AllArgsConstructor
public class SignUpdater implements Runnable {
private final BuycraftPlugin plugin;
@Override
public void run() {
List<RecentPurchaseSignPosition> signs = plugin.getRecentPurchaseSignStorage().getSigns();
OptionalInt maxPos = signs.stream().mapToInt(RecentPurchaseSignPosition::getPosition).max();
if (!maxPos.isPresent()) {
// Nothing to do
return;
}
if (plugin.getApiClient() == null) {
// Can't use API client
return;
}
List<RecentPayment> payments;
try {
payments = plugin.getApiClient().getRecentPayments(Math.min(100, maxPos.getAsInt()));
} catch (IOException | ApiException e) {
plugin.getLogger().error("Could not fetch recent purchases", e);
return;
}
Map<RecentPurchaseSignPosition, RecentPayment> signToPurchases = new HashMap<>();
for (RecentPurchaseSignPosition sign : signs) {
if (sign.getPosition() >= payments.size()) {
signToPurchases.put(sign, null);
} else {
signToPurchases.put(sign, payments.get(sign.getPosition() - 1));
}
}
// Now look up game profiles so that heads can be properly displayed.
Set<String> usernames = payments.stream()
.map(payment -> payment.getPlayer().getName())
.collect(Collectors.toSet());
// Add MHF_Question too.
usernames.add("MHF_Question");
CompletableFuture<Collection<GameProfile>> future = Sponge.getServer().getGameProfileManager().getAllByName(usernames, true);
future.whenComplete((result, throwable) -> {
if (throwable != null) {
plugin.getLogger().error("Unable to fetch player profiles", throwable);
return;
}
Map<String, GameProfile> profileMap = result.stream().filter(p -> p.getName().isPresent())
.collect(Collectors.toMap(p -> p.getName().get(), Function.identity()));
Sponge.getScheduler().createTaskBuilder()
.execute(new SignUpdateApplication(plugin, signToPurchases, profileMap))
.submit(plugin);
});
}
}